#!/bin/bash

# =============================================
# Ansible 项目自动创建脚本
# 功能：一键创建标准的 Ansible 项目目录结构及示例文件
# 使用方法：./create-ansible-project.sh [项目名称]
# 默认项目名称：my-ansible-project
# =============================================

# 设置项目名称（默认：my-ansible-project）
PROJECT_NAME=${1:-my-ansible-project}

# 检查是否已存在同名目录
if [ -d "$PROJECT_NAME" ]; then
  echo "❌ 错误：目录 '$PROJECT_NAME' 已存在，请换一个项目名或删除旧目录。"
  exit 1
fi

echo "🚀 正在创建 Ansible 项目：$PROJECT_NAME ..."

# ======================
# 创建主目录和常用子目录
# ======================
mkdir -p "$PROJECT_NAME"/{inventory,playbooks,roles,vars,files,templates,group_vars,host_vars}

# ======================
# 创建 inventory/hosts
# ======================
cat <<EOF > "$PROJECT_NAME/inventory/hosts"
# Ansible 主机清单文件
# 默认包含一个本地连接组，用于测试

[local]
localhost ansible_connection=local ansible_user=\$(whoami)

# 你可以在这里添加更多主机或组，例如：
# [webservers]
# web1.example.com
# web2.example.com
EOF

# ======================
# 创建ansible配置文件ansible.cfg
# ======================
ansible-config init --disabled > "$PROJECT_NAME"/ansible.cfg
# 指定hosts文件位置，后续执行ansible-playbook命令时不需要使用参数-i
sed -i 's|^;inventory=.*|inventory=inventory/hosts|' "$PROJECT_NAME"/ansible.cfg
# 用于指定 Ansible 在哪些目录中查找 Role（角色）
sed -i 's/^;\(roles_path=\)/\1roles:/' "$PROJECT_NAME"/ansible.cfg
# 用于指定 Ansible 使用哪个版本的python
sed -i 's@;interpreter_python=auto@interpreter_python=/usr/bin/python3@g' "$PROJECT_NAME"/ansible.cfg

# ======================
# 创建示例 Playbook：site.yml
# ======================
cat <<'EOF' > "$PROJECT_NAME/playbooks/site.yml"
---
# 这是一个示例 Ansible Playbook，用于测试项目是否正常工作

- name: 欢迎使用 Ansible！
  hosts: localhost
  connection: local
  gather_facts: false

  tasks:
    - name: 打印欢迎信息
      debug:
        msg: |
          🎉 恭喜！你的 Ansible 项目 "{{ project_name }}" 已创建成功！

          📂 项目结构包含：
            - inventory/hosts         # 主机清单
            - playbooks/site.yml      # 主 Playbook
            - roles/                  # Ansible Roles 目录（可扩展）
            - vars/、templates/等     # 常用目录

          ▶️  你可以运行以下命令来测试：
              ansible-playbook playbooks/site.yml
EOF

# 替换 Playbook 中的变量（项目名称）
sed -i.bak "s/{{ project_name }}/$PROJECT_NAME/g" "$PROJECT_NAME/playbooks/site.yml"

# ======================
# 创建示例 role
# ======================
ansible-galaxy init "$PROJECT_NAME"/roles/test_role
cat <<'EOF' > "$PROJECT_NAME/roles/test_role/tasks/main.yml"
- name: 测试任务
  debug:
    msg: |
      这是一个测试任务，用于测试 Ansible 项目是否正常工作。
      role_name: {{ role_name }}
      inventory_file: {{ inventory_file }}
      role_path: {{ role_path }}
EOF


# ======================
# 创建示例 Playbook：调用role
# ======================
cat <<'EOF' > "$PROJECT_NAME/playbooks/test-role.yml"
---
# 这是一个示例 Ansible Playbook，用于测试项目是否正常工作

- name: 欢迎使用 Ansible！
  hosts: localhost
  connection: local
  gather_facts: false
  roles:
    - test_role
EOF

# ======================
# 创建 README.md
# ======================
cat <<EOF > "$PROJECT_NAME/README.md"
# 🎯 Ansible 项目：$PROJECT_NAME

这是一个使用脚本自动生成的标准 Ansible 项目，包含以下内容：

## 📂 目录结构

EOF

